Run the Setup.R file.
If everything works correctly, you should see a plot:
The qplot() function is the basic workhorse of ggplot2
The qplot() function has a basic syntax:
qplot(variables, plot type, dataset, options)
Objective: Explore the diamonds data set (preloaded along with ggplot2) using qplot for basic plotting.
The data set was scraped from a diamond exchange company data base. It contains the prices and attributes of over 50,000 diamonds.
What does the data look like?
Look at the top few rows of the diamond data frame to find out!
head(diamonds)
## carat cut color clarity depth table price x y z
## 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
## 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
## 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
## 4 0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
## 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
## 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48Basic scatter plot of diamond price vs. carat weight
qplot(carat, price, geom = "point", data = diamonds)Scatter plot of diamond price vs carat weight showing versitility of options in qplot
qplot(carat, log(price), geom = "point", data = diamonds,
alpha = I(0.2), color = color,
main = "Log price by carat weight, grouped by color") +
xlab("Carat Weight") + ylab("Log Price")All of the “Your Turns” for this section will use the tips data set:
tips <- read.csv("https://bit.ly/2gGoiLR")qplot(data = tips, x = total_bill, y = tip)qplot(data = tips, x = total_bill, y = tip, color = smoker)qplot(data = tips, x = total_bill, y = tip, color = smoker,
xlab = "Total Bill ($)", ylab = "Tip ($)",
main = "Tip left by patrons' total bill and smoking status")To make a map, load up the states data and take a look:
states <- map_data("state")
head(states)
## long lat group order region subregion
## 1 -87.46201 30.38968 1 1 alabama <NA>
## 2 -87.48493 30.37249 1 2 alabama <NA>
## 3 -87.52503 30.37249 1 3 alabama <NA>
## 4 -87.53076 30.33239 1 4 alabama <NA>
## 5 -87.57087 30.32665 1 5 alabama <NA>
## 6 -87.58806 30.32665 1 6 alabama <NA>What data is needed in order to plot a basic map?
The states data has all necessary information
A bunch of latitude longitude points…
qplot(long, lat, geom = "point", data = states)… that are connected with lines in a very specific order.
qplot(long, lat, geom = "path", data = states, group = group) +
coord_map()qplot(long, lat, geom = "polygon", data = states, group = group) +
coord_map()qplot(long, lat, geom = "polygon",
fill = I("white"), color = I("black"),
data = states, group = group) +
coord_map()geom = "polygon" to treat states as solid shapesIf a categorical variable is assigned as the fill color then qplot will assign different hues for each category.
Load in a state regions dataset:
statereg <- read.csv("https://bit.ly/2i0AFHK")
head(statereg)
## State StateGroups
## 1 california West
## 2 nevada West
## 3 oregon West
## 4 washington West
## 5 idaho West
## 6 montana Westjoin or merge the original states data with new info
The left_join function is used for merging**:
library(dplyr)
states.class.map <- left_join(states, statereg, by = c("region" = "State"))
head(states.class.map)
## long lat group order region subregion StateGroups
## 1 -87.46201 30.38968 1 1 alabama <NA> South
## 2 -87.48493 30.37249 1 2 alabama <NA> South
## 3 -87.52503 30.37249 1 3 alabama <NA> South
## 4 -87.53076 30.33239 1 4 alabama <NA> South
## 5 -87.57087 30.32665 1 5 alabama <NA> South
## 6 -87.58806 30.32665 1 6 alabama <NA> Southqplot(long, lat, geom = "polygon", data = states.class.map,
group = group, fill = StateGroups, color = I("black")) +
coord_map() states.stats <- read.csv("https://bit.ly/2gT95Hc")
## state.name avg.wt avg.qlrest2 avg.ht avg.bmi avg.drnk
## 1 alabama 180.7247 9.051282 168.0310 29.00222 2.333333
## 2 alaska 189.2756 8.380952 172.0992 28.90572 2.323529
## 3 arizona 169.6867 5.770492 168.2616 27.04900 2.406897
## 4 arkansas 177.3663 8.226619 168.7958 28.02310 2.312500
## 5 california 170.0464 6.847751 168.1314 27.23330 2.170000
## 6 colorado 167.1702 8.134715 169.6110 26.16552 1.970501states.map <- left_join(states, states.stats, by = c("region" = "state.name"))
head(states.map)
## long lat group order region subregion avg.wt avg.qlrest2
## 1 -87.46201 30.38968 1 1 alabama <NA> 180.7247 9.051282
## 2 -87.48493 30.37249 1 2 alabama <NA> 180.7247 9.051282
## 3 -87.52503 30.37249 1 3 alabama <NA> 180.7247 9.051282
## 4 -87.53076 30.33239 1 4 alabama <NA> 180.7247 9.051282
## 5 -87.57087 30.32665 1 5 alabama <NA> 180.7247 9.051282
## 6 -87.58806 30.32665 1 6 alabama <NA> 180.7247 9.051282
## avg.ht avg.bmi avg.drnk
## 1 168.031 29.00222 2.333333
## 2 168.031 29.00222 2.333333
## 3 168.031 29.00222 2.333333
## 4 168.031 29.00222 2.333333
## 5 168.031 29.00222 2.333333
## 6 168.031 29.00222 2.333333Average # of days in the last 30 days of insufficient sleep
qplot(long, lat, geom = "polygon", data = states.map,
group = group, fill = avg.qlrest2) + coord_map()states.sex.stats <- read.csv("https://srvanderplas.github.io/NPPD-Analytics-Workshop/02.Graphics/data/states.sex.stats.csv")
states.sex.stats <- read.csv("https://bit.ly/2hiKFIb")
head(states.sex.stats)
## state.name SEX avg.wt avg.qlrest2 avg.ht avg.bmi avg.drnk sex
## 1 alabama 1 198.8936 8.648936 177.5729 28.50714 3.033333 Male
## 2 alabama 2 173.0315 9.224771 163.9956 29.21280 2.041667 Female
## 3 alaska 1 203.3919 7.236111 178.3896 28.91494 2.487179 Male
## 4 alaska 2 169.5660 9.907407 163.1296 28.89286 2.103448 Female
## 5 arizona 1 191.3739 5.163793 177.1724 27.63152 2.814286 Male
## 6 arizona 2 156.2054 6.142857 162.7043 26.67683 2.026667 Femalestates.sex.map <- left_join(states, states.sex.stats, by = c("region" = "state.name"))
head(states.sex.map)
## long lat group order region subregion SEX avg.wt
## 1 -87.46201 30.38968 1 1 alabama <NA> 1 198.8936
## 2 -87.46201 30.38968 1 1 alabama <NA> 2 173.0315
## 3 -87.48493 30.37249 1 2 alabama <NA> 1 198.8936
## 4 -87.48493 30.37249 1 2 alabama <NA> 2 173.0315
## 5 -87.52503 30.37249 1 3 alabama <NA> 1 198.8936
## 6 -87.52503 30.37249 1 3 alabama <NA> 2 173.0315
## avg.qlrest2 avg.ht avg.bmi avg.drnk sex
## 1 8.648936 177.5729 28.50714 3.033333 Male
## 2 9.224771 163.9956 29.21280 2.041667 Female
## 3 8.648936 177.5729 28.50714 3.033333 Male
## 4 9.224771 163.9956 29.21280 2.041667 Female
## 5 8.648936 177.5729 28.50714 3.033333 Male
## 6 9.224771 163.9956 29.21280 2.041667 FemaleAverage # of alcoholic drinks per day by state and gender
qplot(long, lat, geom = "polygon", data = states.sex.map,
group = group, fill = avg.drnk) + coord_map() +
facet_grid(sex ~ .)left_join to combine child healthcare data with maps information.states.health.stats <- read.csv("https://bit.ly/2hRBMq0")qplot to create a map of child healthcare undercoverage rate by statelibrary(maps)
library(dplyr)
states <- map_data("state")
states.health.map <- left_join(states, states.health.stats,
by = c("region" = "state.name"))
# Use qplot to create a map of child healthcare undercoverage
# rate by state
qplot(data = states.health.map, x = long, y = lat,
geom = 'polygon', group = group,
fill = no.coverage) + coord_map()Use ggplot2 options to clean up the map!
+ ggtitle(...)+ theme_bw()+ theme(...)+ scale_fill_gradient2(...)+ coord_map()qplot(long, lat, geom = "polygon", data = states.map,
group = group, fill = avg.drnk) +
coord_map() + theme_bw() +
scale_fill_gradient2(
name = "Avg Drinks",
limits = c(1.5, 3.5),
low = "lightgray", high = "red") +
theme(axis.ticks = element_blank(),
axis.text = element_blank(),
axis.title = element_blank()) +
ggtitle("Average Number of Alcoholic Beverages
Consumed Per Day by State")Use options to polish the look of your map of child healthcare undercoverage rate by state!
qplot(data = states.health.map, x = long, y = lat,
geom = 'polygon', group = group, fill = no.coverage) +
coord_map() +
scale_fill_gradient2(
name = "Child\nHealthcare\nUndercoverage",
limits = c(0, .2),
low = 'white', high = 'red') +
ggtitle("Health Insurance in the U.S.\n
Which states have the highest rates
of undercovered children?") +
theme_minimal() +
theme(panel.grid = element_blank(),
axis.text = element_blank(),
axis.title = element_blank()) Both data sets have geographic coordinates for every observation
NOAA data is a .rdata file. Read it in:
getwd() command to find your current working directoryload("noaa.rdata")Take a peek at the top of the floats NOAA data:
head(floats, n = 2)[,1:5]
## callSign Date_Time JulianDay Time_QC Latitude
## 1 Q4901043 7/12/2010 2455390 1 24.823
## 2 Q4901043 7/12/2010 2455390 1 24.823
head(floats, n = 2)[,6:10]
## Longitude Position_QC Depth Depth_QC Temperature
## 1 -87.964 1 2 1 29.83
## 2 -87.964 1 4 1 29.65
head(floats, n = 2)[,11:14]
## Temperature_QC Salinity Salinity_QC Type
## 1 1 36.59 1 Float
## 2 1 36.58 1 Floatqplot(Longitude, Latitude, color = callSign, data = floats) +
coord_map()qplot(Longitude, Latitude, color = callSign, data = gliders) +
coord_map()qplot(Longitude, Latitude, color = callSign, data = boats) +
coord_map()This data has the same context - a common time and common place
ggplot2ggplot() +
geom_path(data = states, aes(x = long, y = lat, group = group)) +
geom_point(data = floats, aes(x = Longitude, y = Latitude, color = callSign)) +
geom_point(aes(x, y), shape = "x", size = 5, data = rig) +
geom_text(aes(x, y), label = "BP Oil Rig",
size = 5, data = rig, hjust = -0.1) +
xlim(c(-91, -80)) + ylim(c(22,32)) + coord_map()Data: floats, states
Mappings:
|
Scales:
|
Geoms: Points (floats), lines (states)
Facetting: None
qplot vs ggplotqplot() stands for “quickplot”:
ggplot() stands for “grammar of graphics plot”
qplot vs ggplotTwo ways to construct the same plot for float locations:
qplot(Longitude, Latitude, color = callSign, data = floats) Or:
ggplot(data = floats,
aes(x = Longitude, y = Latitude, color = callSign)) +
geom_point() +
scale_x_continuous() +
scale_y_continuous() +
scale_color_discrete()Even ggplot will automatically pick default scales:
ggplot(data = floats,
aes(x = Longitude, y = Latitude, color = callSign)) +
geom_point()Find the ggplot() statement that creates this plot:
Hint: look at the Floats data for variable ideas
ggplot(aes(x = Depth, y = Temperature, color = callSign),
data = floats) +
geom_point()A layer added ggplot() can be a geom…
… or a position adjustment to the scales
| Plot | Geom | Stat |
|---|---|---|
| Scatterplot | point | identity |
| Histogram | bar | bin count |
| Smoother | line + ribbon | smoother function |
| Binned Scatterplot | rectange + color | 2d bin count |
More geoms described at http://docs.ggplot2.org/current/
Build a map using NOAA data
ggplot() +
geom_path(data = states, aes(x = long, y = lat, group = group)) +
geom_point(data = floats, aes(x = Longitude, y = Latitude, color = callSign)) +
geom_point(aes(x, y), shape = "x", size = 5, data = rig) +
geom_text(aes(x, y), label = "BP Oil Rig", size = 5, data = rig, hjust = -0.1) +
xlim(c(-91, -80)) +
ylim(c(22, 32)) + coord_map()animal <- read.csv("https://bit.ly/2hNlTUl")library(lubridate)
animal$month <- month(as.Date(animal$Date_))ggplot() +
geom_path(data = states, aes(x = long, y = lat, group = group)) +
geom_point(data = animal, aes(x = Longitude, y = Latitude)) +
xlim(c(-91, -80)) + ylim(c(24,32)) + coord_map()ggplot() +
geom_path(data = states, aes(x = long, y = lat, group = group)) +
geom_point(data = animal, aes(x = Longitude, y = Latitude,
color = class)) +
xlim(c(-91, -80)) + ylim(c(24,32)) + coord_map()ggplot() +
geom_path(data = states, aes(x = long, y = lat, group = group)) +
geom_point(data = animal, aes(x = Longitude, y = Latitude,
color = Condition)) +
xlim(c(-91, -80)) + ylim(c(24,32)) + coord_map()ggplot() +
geom_path(data = states, aes(x = long, y = lat, group = group)) +
geom_point(data = animal, aes(x = Longitude, y = Latitude,
color = Condition), alpha = .5) +
xlim(c(-91, -80)) + ylim(c(24,32)) +
facet_wrap(~month) + coord_map() Graphics consist of:
Both the structure and aesthetics should help viewers interpret the information.
Find ways to improve the following graphic:
frame <- read.csv("https://bit.ly/2i3Q4Gf")
qplot(x, y, data = frame, shape = g1, colour = g2, size = I(4))interaction combines factor variables# Make sure the "oddball" stands out while keeping the
# information on the groups
frame$inter <- interaction(frame$g1, frame$g2)
ggplot(frame, aes(x, y)) +
geom_point(aes(shape = g1, color = inter), size = I(4))# Make sure the "oddball" stands out while keeping the
# information on the groups
frame$inter <- interaction(frame$g1, frame$g2)
ggplot(frame, aes(x, y)) +
geom_point(aes(shape = g1, fill = g2, color = inter), size = I(4), stroke = I(2)) +
scale_shape_manual(values = c(21,23)) +
scale_fill_manual(values = c("red", "green")) +
scale_colour_manual(values = c("red", "black", "green")) +
guides(fill = guide_legend(override.aes = list(color = c("red", "green"))),
colour = guide_legend(override.aes = list(fill = "white", shape = 22)))Using the previous list, which is a more accurate way to display the same data:
Using the previous list, which is a more accurate way to display the same data:
A bar chart displays information on a common aligned scale. A pie chart requires comparisons of angles and/or area, which are less accurate.
If you have observations of height and weight over time, and height is more important than weight, how would you construct your plot?
| aesthetic | variable |
|---|---|
| x | |
| y | |
| color |
If you have observations of height and weight over time, and height is more important than weight, how would you construct your plot?
| aesthetic | variable |
|---|---|
| x | time |
| y | height |
| color | weight |
Since height is more important to show, it should be displayed using a position scale. Weight is less important, so it should be shown using a color scale.
ggplot2Main parameters: alpha, shape, color, size
Color is context-sensitive:
Color is context-sensitive:
A and B are the same intensity and hue, but appear to be different.
Color is context-sensitive:
A and B are the same intensity and hue, but appear to be different.
Qualitative schemes: no more than 7 colors
Quantitative schemes: use color gradient with only one hue for positive values
Quantitative schemes: use color gradient with two hues for positive and negative values.
Gradient should go through a light, neutral color (white) corresponding to 0.
Small objects or thin lines need more contrast than larger areas
R package based on Cynthia Brewer’s color schemes (http://www.colorbrewer2.org)
ggplot2scale_colour_discretescale_colour_brewer(palette = ...)scale_colour_gradient (define low, high values)scale_colour_gradient2 (define low, mid, and high values)scale_fill_...qplot(carat, price, colour = clarity, data = diamonds)qplot(carat, price, colour = clarity, data = diamonds) +
scale_colour_brewer(palette = "BuGn")qplot Syntax: facets = row ~ col Use . if there is no variable for either row or column (i.e. facets = . ~ col)ggplot Syntax: + facet_wrap(~ variable) or + facet_grid(row ~ col)qplot(price, carat, data = diamonds, color = color,
facets = . ~ clarity)The movies dataset contains information from IMDB.com including ratings, genre, length in minutes, and year of release.
movies <- read.csv("https://bit.ly/2hqhCoM")ggplot(movies, aes(x = year, y = budget,
group = genre, color = genre)) +
geom_point()ggplot(movies, aes(x = year, y = budget,
group = genre, color = genre)) +
geom_point(alpha = I(.2)) +
facet_wrap(~genre)ggplot(movies, aes(x = genre, fill = mpaa)) + geom_bar() ggplot(movies, aes(x = year, y = length,
group = genre, color = genre)) +
geom_smooth(fullrange = F) +
coord_cartesian(ylim = c(0, 150))ggplot(movies, aes(x = budget, y = rating, group = genre)) +
geom_point(alpha = .1) +
facet_grid(mpaa ~ genre) +
geom_smooth(method = "lm", se = F) +
scale_x_log10()This section focuses on the details of plots - background colors, appearance, fonts, etc.
These details allow for highly customized plots.
qplot(carat, price, data = diamonds) +
ggtitle("Price vs Carat for Diamonds")qplot(carat, price, data = diamonds)
qplot(carat, price, data = diamonds) + theme_bw()theme_set specifies a default theme for all plots:
theme_set(theme_bw())It is also possible to compare the options for each theme:
theme_bw()
## List of 44
## $ line :List of 4
## ..$ colour : chr "black"
## ..$ size : num 0.5
## ..$ linetype: num 1
## ..$ lineend : chr "butt"
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ rect :List of 4
## ..$ fill : chr "white"
## ..$ colour : chr "black"
## ..$ size : num 0.5
## ..$ linetype: num 1
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ text :List of 10
## ..$ family : chr ""
## ..$ face : chr "plain"
## ..$ colour : chr "black"
## ..$ size : num 12
## ..$ hjust : num 0.5
## ..$ vjust : num 0.5
## ..$ angle : num 0
## ..$ lineheight: num 0.9
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 0 0 0 0
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : logi FALSE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.line :List of 4
## ..$ colour : NULL
## ..$ size : NULL
## ..$ linetype: NULL
## ..$ lineend : NULL
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ axis.line.x : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.line.y : list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.text :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size :Class 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.x :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : num 1
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 2.4 0 0 0
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.text.y :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 1
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 0 2.4 0 0
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.ticks :List of 4
## ..$ colour : chr "black"
## ..$ size : NULL
## ..$ linetype: NULL
## ..$ lineend : NULL
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ axis.ticks.length :Class 'unit' atomic [1:1] 3
## .. ..- attr(*, "unit")= chr "pt"
## .. ..- attr(*, "valid.unit")= int 8
## $ axis.title.x :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 4.8 0 2.4 0
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ axis.title.y :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : num 90
## ..$ lineheight: NULL
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 0 4.8 0 2.4
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.background :List of 4
## ..$ fill : NULL
## ..$ colour : logi NA
## ..$ size : NULL
## ..$ linetype: NULL
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ legend.margin :Class 'unit' atomic [1:1] 0.2
## .. ..- attr(*, "unit")= chr "cm"
## .. ..- attr(*, "valid.unit")= int 1
## $ legend.key :List of 4
## ..$ fill : NULL
## ..$ colour : chr "grey80"
## ..$ size : NULL
## ..$ linetype: NULL
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ legend.key.size :Class 'unit' atomic [1:1] 1.2
## .. ..- attr(*, "unit")= chr "lines"
## .. ..- attr(*, "valid.unit")= int 3
## $ legend.key.height : NULL
## $ legend.key.width : NULL
## $ legend.text :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size :Class 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.text.align : NULL
## $ legend.title :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : num 0
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ legend.title.align : NULL
## $ legend.position : chr "right"
## $ legend.direction : NULL
## $ legend.justification : chr "center"
## $ legend.box : NULL
## $ panel.background :List of 4
## ..$ fill : chr "white"
## ..$ colour : logi NA
## ..$ size : NULL
## ..$ linetype: NULL
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ panel.border :List of 4
## ..$ fill : logi NA
## ..$ colour : chr "grey50"
## ..$ size : NULL
## ..$ linetype: NULL
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ panel.grid.major :List of 4
## ..$ colour : chr "grey90"
## ..$ size : num 0.2
## ..$ linetype: NULL
## ..$ lineend : NULL
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ panel.grid.minor :List of 4
## ..$ colour : chr "grey98"
## ..$ size : num 0.5
## ..$ linetype: NULL
## ..$ lineend : NULL
## ..- attr(*, "class")= chr [1:2] "element_line" "element"
## $ panel.margin :Class 'unit' atomic [1:1] 6
## .. ..- attr(*, "unit")= chr "pt"
## .. ..- attr(*, "valid.unit")= int 8
## $ panel.margin.x : NULL
## $ panel.margin.y : NULL
## $ panel.ontop : logi FALSE
## $ strip.background :List of 4
## ..$ fill : chr "grey80"
## ..$ colour : chr "grey50"
## ..$ size : num 0.2
## ..$ linetype: NULL
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ strip.text :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : chr "grey10"
## ..$ size :Class 'rel' num 0.8
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ strip.text.x :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 6 0 6 0
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ strip.text.y :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : NULL
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : num -90
## ..$ lineheight: NULL
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 0 6 0 6
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ strip.switch.pad.grid:Class 'unit' atomic [1:1] 0.1
## .. ..- attr(*, "unit")= chr "cm"
## .. ..- attr(*, "valid.unit")= int 1
## $ strip.switch.pad.wrap:Class 'unit' atomic [1:1] 0.1
## .. ..- attr(*, "unit")= chr "cm"
## .. ..- attr(*, "valid.unit")= int 1
## $ plot.background :List of 4
## ..$ fill : NULL
## ..$ colour : chr "white"
## ..$ size : NULL
## ..$ linetype: NULL
## ..- attr(*, "class")= chr [1:2] "element_rect" "element"
## $ plot.title :List of 10
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size :Class 'rel' num 1.2
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight: NULL
## ..$ margin :Classes 'margin', 'unit' atomic [1:4] 0 0 7.2 0
## .. .. ..- attr(*, "unit")= chr "pt"
## .. .. ..- attr(*, "valid.unit")= int 8
## ..$ debug : NULL
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## $ plot.margin :Classes 'margin', 'unit' atomic [1:4] 6 6 6 6
## .. ..- attr(*, "unit")= chr "pt"
## .. ..- attr(*, "valid.unit")= int 8
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi TRUE
## - attr(*, "validate")= logi TRUECreate a theme, or modify an existing one.
Themes are made up of elements which can be one of:
This provides a lot of control over plot appearance.
p <- qplot(carat, price, data = diamonds) +
ggtitle("Price vs Carat for Diamonds")
p + theme(plot.title = element_text(colour = "red", angle = 20))Use this power wisely
It’s also possible to remove all axes (helpful for maps):
p + theme(
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.ticks.length = unit(0, "cm")
)The ggsave() function will save the last plot produced:
qplot(total_bill, tip, data = tips)
ggsave("tips.png")
ggsave("tips.pdf")
ggsave("tips.png", width = 6, height = 6)Or explicitly tell it which plot to save:
dplot <- qplot(total_bill, tip, data = tips)
ggsave("tips.png", plot = dplot, dpi = 72)qplot(price, carat, data = diamonds)
ggsave("diamonds.pdf")
## Saving 7 x 4 in image
ggsave("diamonds.png")
## Saving 7 x 4 in image